package jeudelavie.modele;

import java.util.Observable;
import java.util.logging.Level;
import java.util.logging.Logger;
import jeudelavie.vue.Vue;

/**
 *
 * @author epulapp
 */
public class Environnement extends Observable implements Simulable {

    private Case[][] cases;

    /**
     * Constructeur
     *
     * @param sizeX
     * @param sizeY
     */
    public Environnement(int sizeY, int sizeX) {
        cases = new Case[sizeY][sizeX];
        Generer();


    } // Environnement()

    public void Generer() {
        for (int i = 0; i < cases.length; i++) {
            for (int j = 0; j < cases[i].length; j++) {
                cases[i][j] = new Case(i, j, this);
            }
        }
        this.setChanged();
        this.notifyObservers(cases);
    }

    public void FeuilleBlanche() {
        for (int i = 0; i < cases.length; i++) {
            for (int j = 0; j < cases[i].length; j++) {
                cases[i][j] = new Case(i, j, this, true);
            }
        }
        this.setChanged();
        this.notifyObservers(cases);
    }

    public void ForcerUpdate() {
        this.setChanged();
        this.notifyObservers(cases);
    }

    /**
     * Fonctions métiers
     */
    /**
     * Retourne les cases voisines
     *
     * @param _case
     * @return
     */
    public Case[] getVoisines(Case _case) {
        Case[] casesVoisines = new Case[8];
        int i = 0;
        for (int x = -1; x <= 1; x++) {
            for (int y = -1; y <= 1; y++) {
                if (_case.getX() + x < cases.length
                        && _case.getX() + x >= 0
                        && _case.getY() + y < cases[0].length
                        && _case.getY() + y >= 0
                        && !(x == 0 && y == 0)) {
                    //if (_case.isEtat()) { //Si il s'agit d'une cellule vivante
                        //if (cases[_case.getX() + x][_case.getY() + y].getCouleur() == _case.getCouleur()) {//On n'ajoute que les cellules qui sont de la même couleur
                            casesVoisines[i++] = cases[_case.getX() + x][_case.getY() + y];
                        //}
                   // }else {//Si c'est une cellule morte
                    //    casesVoisines[i++] = cases[_case.getX() + x][_case.getY() + y]; //On ajoute toutes les cellules
                   // }
                }
            }
        }
        return casesVoisines;
    } // getVoisines()

    /**
     * Génère la totalité de la grille
     */
    public void calculer() {
        for (int i = 0; i < cases.length; i++) {
            for (int j = 0; j < cases[i].length; j++) {
                cases[i][j].calculEtatSuivant();
            }
        }
        for (int i = 0; i < cases.length; i++) {
            for (int j = 0; j < cases[i].length; j++) {
                cases[i][j].majEtat();
            }
        }

        //afficher();
        this.setChanged();
        this.notifyObservers(cases);

    }//calculer()

    public void afficher() {

        System.out.println();

        for (int i = 0; i < cases.length; i++) {
            for (int j = 0; j < cases[i].length; j++) {
                if (cases[i][j].isEtat()) {
                    System.out.print("1");
                } else {
                    System.out.print("0");
                }

                System.out.print(" ");
            }
            System.out.println();
        }
    }//afficher()

    public Case[][] getCases() {
        return cases;
    }
}//Environnement
